﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc;
using Viettel.VOFFICE.DAO.Enums;
using Viettel.VOFFICE.DAO.Helpers;
using Viettel.VOFFICE.Web.Helpers;
using Viettel.VOFFICE.Web.Models;

namespace Viettel.VOFFICE.Web.Controllers
{
    /// <summary>
    /// Controller này chỉ phụ trách việc đưa các giá trị có  tính key-value 
    /// để đưa vào dropdownlist hay listbox lựa chọn dữ liệu
    /// việc lấy dữ liệu kiểu trên nên được viết tập trung và tận dụng ở đây
    /// </summary>
    public class KeyValueController : BaseController
    {
        //các hàm đã có, xem trước khi viết thêm
        //get_book_reset_by
        //get_book_type
        //get_book_list
        //get_doc_properties
        //get_doctype_list
        //get_role_list
        //get_book
        //get_book_receive
        //get_doc_type
        //get_doc_property
        //get_flow
        //get_department_tree
        /// <summary>
        /// Lấy các trường hợp reset lại số đánh công văn trong sổ
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        [ActionName("get_book_reset_by")]
        public JsonResult GetBookResetBy()
        {
            try
            {
                var dic = EnumHelper<BookResetType>.GetDicValues();
                return Json(new JsonResponse()
                                {
                                    Status = true,
                                    Result = dic.Select(o => new KeyValueModel() { Key = o.Key, Value = o.Value })
                                }, JsonRequestBehavior.AllowGet);
            }
            catch (Exception)
            {
                return Json(SimplyResponse.Response500(), JsonRequestBehavior.AllowGet);
                throw;
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        [ActionName("get_book_type")]
        public JsonResult GetBookType()
        {
            try
            {
                var dic = EnumHelper<BookType>.GetDicValues();
                return Json(new JsonResponse()
                {
                    Status = true,
                    Result = dic.Select(o => new KeyValueModel() { Key = o.Key, Value = o.Value })
                }, JsonRequestBehavior.AllowGet);
            }
            catch (Exception)
            {
                return Json(SimplyResponse.Response500(), JsonRequestBehavior.AllowGet);
                throw;
            }
        }

        /// <summary>
        /// Lấy ra sổ văn bản
        /// Bỏ qua các giá trị không active
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        [ActionName("get_book_list")]
        public JsonResult GetBookList()
        {
            try
            {
                var items = unitOfWork.BookRepository.GetAllActive().Select(o => new KeyValueModel() { Key = o.Id, Value = o.Name }).ToList();
                items.Insert(0, new KeyValueModel()
                                   {
                                       Key = 0,
                                       Value = @Resources.Resources.KeyValueGetBookListDefault
                                   });
                return Json(new JsonResponse() { Status = true, Result = items }, JsonRequestBehavior.AllowGet);
            }
            catch (Exception)
            {
                return Json(SimplyResponse.Response500(), JsonRequestBehavior.AllowGet);
                throw;
            }
        }


        /// <summary>
        /// Lấy ra enum thuộc tính của văn bản By: anhtt67
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        [ActionName("get_doc_properties")]
        public JsonResult GetDocProperties()
        {
            try
            {
                var dic = EnumHelper<DocPropertyType>.GetDicValues();
                return Json(new JsonResponse()
                                {
                                    Status = true,
                                    Result = dic.Select(o => new KeyValueModel() { Key = o.Key, Value = o.Value })
                                }, JsonRequestBehavior.AllowGet);
            }
            catch (Exception)
            {
                return Json(SimplyResponse.Response500(), JsonRequestBehavior.AllowGet);
                //throw;
            }
        }
        [HttpGet]
        [ActionName("get_metadata")]
        public JsonResult GetMetaData()
        {
            try
            {
                var dic = EnumHelper<MetaDataType>.GetDicValues();
                return Json(new JsonResponse()
                                {
                                    Status = true,
                                    Result = dic.Select(o => new KeyValueModel() { Key = o.Key, Value = o.Value })
                                }, JsonRequestBehavior.AllowGet);
            }
            catch (Exception)
            {

                return Json(SimplyResponse.Response500(), JsonRequestBehavior.AllowGet);
            }
        }

        public int parentID { get; set; }
        //thay đổi id= name
        [HttpGet]
        [ActionName("get_parent_name")]
        public JsonResult GetParentName(string parentName)
        {
            var items = unitOfWork.MetaDataRepository.Get().Select(o => new KeyValueModel() { Key = o.Id, Value = o.Name }).ToList();
            items.Insert(0, new KeyValueModel()
            {
                Key = parentID,
                Value = parentName
            });
            items.Insert(0, new KeyValueModel() { Key = 0, Value = "--Chon--" });
            return Json(new JsonResponse() { Status = true, Result = items }, JsonRequestBehavior.AllowGet);
        }


        /// <summary>
        /// Lấy ra toàn bộ doctype của hệ thống
        /// Lấy để chọn nên bỏ qua các trường hợp IsAcive = false
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        [ActionName("get_doctype_list")]
        public JsonResult GetDocTypeList()
        {
            try
            {
                var items = unitOfWork.DocumentTypeRepository.GetAllActive().Select(o => new KeyValueModel() { Key = o.Id, Value = o.Name }).ToList();
                items.Insert(0, new KeyValueModel()
                {
                    Key = 0,
                    Value = @Resources.Resources.KeyValueGetDocTypeListDefault
                });
                return Json(new JsonResponse() { Status = true, Result = items }, JsonRequestBehavior.AllowGet);
            }
            catch (Exception)
            {
                return Json(SimplyResponse.Response500(), JsonRequestBehavior.AllowGet);
                throw;
            }
        }

        /// <summary>
        /// Lấy ra list quyền
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        [ActionName("get_role_list")]
        public JsonResult GetRoleList()
        {
            try
            {
                var items = unitOfWork.RoleRepository.GetByType();
                return Json(new JsonResponse()
                                {
                                    Status = true,
                                    Result = items.Select(o => new KeyValueModel()
                                                                   {
                                                                       Key = o.RoleId,
                                                                       Value = o.RoleName
                                                                   })
                                }, JsonRequestBehavior.AllowGet);
            }
            catch (Exception)
            {
                return Json(SimplyResponse.Response500(), JsonRequestBehavior.AllowGet);
                //throw;
            }
        }

        /// <summary>
        /// Lấy ra các loại sổ văn bản, (dành cho phần vào sổ văn bản đến đi)
        /// </summary>
        /// <param name="bookType"></param>
        /// <param name="deptId"></param>
        /// <returns></returns>
        [HttpGet]
        [ActionName("get_book")]
        public JsonResult GetBook(BookType bookType, int? deptId)
        {
            try
            {
                var item = unitOfWork.BookRepository.GetByBookTypeAndDept(bookType, deptId).Select(o => new KeyValueModel()
                    {
                        Key = o.Id,
                        Value = o.Name
                    });
                return Json(new JsonResponse() { Status = true, Result = item }, JsonRequestBehavior.AllowGet);
            }
            catch (Exception)
            {
                return Json(SimplyResponse.Response500(), JsonRequestBehavior.AllowGet);
                throw;
            }
        }
        [HttpGet]
        [ActionName("get_book_receive")]
        public JsonResult GetBook(int? deptId)
        {
            try
            {
                var item = unitOfWork.BookRepository.GetByBookTypeAndDept(BookType.Receive, deptId).Select(o => new KeyValueModel()
                {
                    Key = o.Id,
                    Value = o.Name
                }).ToList();
                item.Insert(0, new KeyValueModel()
                    {
                        Key = 0,
                        Value = Resources.Resources.KeyValueGetBookListDefault
                    });
                return Json(new JsonResponse() { Status = true, Result = item }, JsonRequestBehavior.AllowGet);
            }
            catch (Exception)
            {
                return Json(SimplyResponse.Response500(), JsonRequestBehavior.AllowGet);
                throw;
            }
        }

        /// <summary>
        /// Lấy các loại văn bản, (lấy cho phần vào sổ)
        /// </summary>
        /// <param name="bookId"></param>
        /// <returns></returns>
        [HttpGet]
        [ActionName("get_doc_type")]
        public JsonResult GetDocType(int bookId)
        {
            try
            {
                var item = unitOfWork.DocumentTypeRepository.GetByBook(bookId)
                    .Select(o => new KeyValueModel()
                {
                    Key = o.Id,
                    Value = o.Name
                }).ToList();
                item.Insert(0, new KeyValueModel()
                    {
                        Key = 0,
                        Value = Resources.Resources.KeyValueGetDocTypeListDefault
                    });
                return Json(new JsonResponse() { Status = true, Result = item }, JsonRequestBehavior.AllowGet);
            }
            catch (Exception)
            {
                return Json(SimplyResponse.Response500(), JsonRequestBehavior.AllowGet);
                throw;
            }
        }

        /// <summary>
        /// Lấy ra các thuộc tính của văn bản
        /// </summary>
        /// <param name="dpType"></param>
        /// <returns></returns>
        [HttpGet]
        [ActionName("get_doc_property")]
        public JsonResult GetDocProperty(DocPropertyType dpType)
        {
            try
            {
                var item = unitOfWork.DocumentPropertyRepository.GetByType(dpType).Select(o => new KeyValueModel()
                    {
                        Key = o.Id,
                        Value = o.Name
                    });
                return Json(new JsonResponse() { Status = true, Result = item }, JsonRequestBehavior.AllowGet);
            }
            catch (Exception)
            {
                return Json(SimplyResponse.Response500(), JsonRequestBehavior.AllowGet);
                throw;
            }
        }

        /// <summary>
        /// Lấy thông tin của luồng
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        [ActionName("get_flow")]
        public JsonResult GetFlow(int? docTypeId)
        {
            try
            {
                var id = docTypeId ?? 0;
                List<KeyValueModel> item;
                if (id != 0)
                {
                    item = unitOfWork.FlowRepository.GetByDocTypeAndCommon(id).Select(o => new KeyValueModel()
                            {
                                Key = o.Id,
                                Value = o.Name
                            }).ToList();
                }
                else
                {
                    item = unitOfWork.FlowRepository.GetByCommon(true).Select(o => new KeyValueModel()
                            {
                                Key = o.Id,
                                Value = o.Name
                            }).ToList();
                }
                return Json(new JsonResponse() { Status = true, Result = item }, JsonRequestBehavior.AllowGet);
            }
            catch (Exception)
            {
                return Json(SimplyResponse.Response500(), JsonRequestBehavior.AllowGet);
                throw;
            }
        }

        [HttpGet]
        [ActionName("get_department_tree")]
        public JsonResult GetDepartmentTree()
        {
            try
            {
                var item = unitOfWork.DeparmentRepository.DeptTree().Select(o => new KeyValueModel()
                    {
                        Key = o.Id,
                        //Value = string.Concat(Enumerable.Repeat("_", o.Node)) + o.Name
                        Value = o.Name
                    }).ToList();
                item.Insert(0, new KeyValueModel()
                    {
                        Key = 0,
                        Value = Resources.Resources.KeyvalueGetDepartmentDefault
                    });
                return Json(new JsonResponse() { Status = true, Result = item }, JsonRequestBehavior.AllowGet);
            }
            catch (Exception)
            {
                return Json(SimplyResponse.Response500(), JsonRequestBehavior.AllowGet);
                throw;
            }
        }
    }
}
